package com.zenithmind.version.pojo.dto;

import com.zenithmind.version.pojo.dto.base.BaseDTO;
import io.swagger.v3.oas.annotations.media.Schema;
import jakarta.validation.Valid;
import jakarta.validation.constraints.NotBlank;
import jakarta.validation.constraints.NotNull;
import jakarta.validation.constraints.Size;
import lombok.Data;
import lombok.EqualsAndHashCode;

/**
 * 创建仓库DTO - 遵循组合模式，组合多个专门的DTO
 *
 * @author ZenithMind Team
 * @since 2025-01-09
 */
@Data
@EqualsAndHashCode(callSuper = true)
@Schema(description = "创建仓库DTO")
public class RepositoryCreateDTO extends BaseDTO {

    /**
     * 仓库所有者ID
     */
    @NotBlank(message = "所有者ID不能为空")
    @Schema(description = "仓库所有者ID", example = "user123")
    private String ownerId;

    /**
     * 仓库基本信息
     */
    @Valid
    @NotNull(message = "仓库基本信息不能为空")
    @Schema(description = "仓库基本信息")
    private RepositoryBasicInfoDTO basicInfo;

    /**
     * 仓库配置信息
     */
    @Valid
    @Schema(description = "仓库配置信息")
    private RepositoryConfigDTO config;

    /**
     * 仓库初始化信息
     */
    @Valid
    @Schema(description = "仓库初始化信息")
    private RepositoryInitDTO initInfo;

    /**
     * 仓库标签（JSON格式）
     */
    @Size(max = 1000, message = "仓库标签长度不能超过1000")
    @Schema(description = "仓库标签（JSON格式）", example = "[\"web\", \"java\"]")
    private String tags;

    /**
     * 获取仓库名称
     *
     * @return 仓库名称
     */
    public String getName() {
        return basicInfo != null ? basicInfo.getName() : null;
    }

    /**
     * 获取仓库描述
     *
     * @return 仓库描述
     */
    public String getDescription() {
        return basicInfo != null ? basicInfo.getDescription() : null;
    }

    /**
     * 获取仓库类型
     *
     * @return 仓库类型
     */
    public Integer getType() {
        return basicInfo != null ? basicInfo.getType() : null;
    }

    /**
     * 获取默认分支
     *
     * @return 默认分支
     */
    public String getDefaultBranch() {
        return basicInfo != null ? basicInfo.getDefaultBranch() : "main";
    }

    /**
     * 获取仓库语言
     *
     * @return 仓库语言
     */
    public String getLanguage() {
        return basicInfo != null ? basicInfo.getLanguage() : null;
    }

    /**
     * 获取主页URL
     *
     * @return 主页URL
     */
    public String getHomepage() {
        return config != null ? config.getHomepage() : null;
    }

    /**
     * 获取是否允许Fork
     *
     * @return 是否允许Fork
     */
    public Integer getAllowFork() {
        return config != null ? config.getAllowFork() : 1;
    }

    /**
     * 获取是否允许Issues
     *
     * @return 是否允许Issues
     */
    public Integer getAllowIssues() {
        return config != null ? config.getAllowIssues() : 1;
    }

    /**
     * 获取是否允许Wiki
     *
     * @return 是否允许Wiki
     */
    public Integer getAllowWiki() {
        return config != null ? config.getAllowWiki() : 1;
    }

    /**
     * 获取是否初始化README
     *
     * @return 是否初始化README
     */
    public Integer getInitReadme() {
        return initInfo != null ? initInfo.getInitReadme() : 1;
    }

    /**
     * 获取是否初始化.gitignore
     *
     * @return 是否初始化.gitignore
     */
    public Integer getInitGitignore() {
        return initInfo != null ? initInfo.getInitGitignore() : 1;
    }

    /**
     * 获取.gitignore模板
     *
     * @return .gitignore模板
     */
    public String getGitignoreTemplate() {
        return initInfo != null ? initInfo.getGitignoreTemplate() : null;
    }

    /**
     * 获取是否初始化LICENSE
     *
     * @return 是否初始化LICENSE
     */
    public Integer getInitLicense() {
        return initInfo != null ? initInfo.getInitLicense() : 0;
    }

    /**
     * 获取LICENSE模板
     *
     * @return LICENSE模板
     */
    public String getLicenseTemplate() {
        return initInfo != null ? initInfo.getLicenseTemplate() : null;
    }

    /**
     * 检查是否为公开仓库
     *
     * @return 是否为公开仓库
     */
    public boolean isPublic() {
        return basicInfo != null && basicInfo.isPublic();
    }

    /**
     * 检查是否需要初始化
     *
     * @return 是否需要初始化
     */
    public boolean needsInitialization() {
        return initInfo != null && initInfo.needsInitialization();
    }

    /**
     * 验证所有组合的DTO
     *
     * @return 是否有效
     */
    @Override
    public boolean isValid() {
        if (!super.isValid()) {
            return false;
        }

        if (basicInfo != null && !basicInfo.isValid()) {
            return false;
        }

        if (config != null && !config.isValid()) {
            return false;
        }

        if (initInfo != null && !initInfo.isValid()) {
            return false;
        }

        return true;
    }
}
